package ai.zixing.framework.context.support;

import ai.zixing.framework.beans.factory.support.BeanDefinitionReader;
import ai.zixing.framework.beans.factory.support.BeanDefinitionRegistry;
import ai.zixing.framework.context.ApplicationContext;

import java.util.HashMap;
import java.util.Map;

/**
 * ApplicationContext 接口的子类实现类
 * 创建容器对象时，加载配置文件，对 bean 进行初始化
 */
public abstract class AbstractApplicationContext implements ApplicationContext {

    //声明解析器变量
    protected BeanDefinitionReader beanDefinitionReader;

    // 定义一个存储 Bean 对象的 Map
    protected Map<String, Object> singletonObjects = new HashMap<>();

    // 声明一个配置文件路径变量
    protected String configLocation;

    @Override
    public void refresh() {
        // 加载 BeanDefinition 对象
        try {
            beanDefinitionReader.loadBeanDefinitions(configLocation);
            // 初始化
            finishInitialization();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    // Bean 的初始化
    private void finishInitialization() throws Exception {
        // 获取注册表对象
        BeanDefinitionRegistry registry = beanDefinitionReader.getRegistry();
        // 获取 BeanDefinition 对象
        String[] beanDefinitionNames = registry.getBeanDefinitionNames();
        for (String beanDefinitionName : beanDefinitionNames) {
            getBean(beanDefinitionName);
        }
    }
}
